#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
生成医疗卫生服务能力综合评价分析报告（面板数据）
"""
import os
import pandas as pd
from docx import Document
from docx.shared import Inches, Pt, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.oxml.ns import qn
import docx.oxml.shared

def set_cell_border(cell, **kwargs):
    """设置单元格边框"""
    tc = cell._tc
    tcPr = tc.get_or_add_tcPr()
    
    for edge in ('top', 'left', 'bottom', 'right'):
        edge_data = kwargs.get(edge)
        if edge_data:
            tag = 'w:{}'.format(edge)
            element = tcPr.find(qn(tag))
            if element is None:
                element = docx.oxml.shared.OxmlElement(tag)
                tcPr.append(element)
            for key in ["sz", "val", "color"]:
                if key in edge_data:
                    element.set(qn('w:{}'.format(key)), str(edge_data[key]))

def add_three_line_table(doc, df, title):
    """添加三线表"""
    # 添加表格标题
    p = doc.add_paragraph()
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    run = p.add_run(title)
    run.font.size = Pt(10.5)
    run.font.name = 'Times New Roman'
    run._element.rPr.rFonts.set(qn('w:eastAsia'), '宋体')
    run.font.bold = True
    
    # 创建表格
    table = doc.add_table(rows=len(df)+1, cols=len(df.columns))
    table.style = 'Table Grid'
    
    # 设置表头
    for i, col in enumerate(df.columns):
        cell = table.rows[0].cells[i]
        cell.text = col
        # 设置表头格式
        for paragraph in cell.paragraphs:
            paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER
            for run in paragraph.runs:
                run.font.size = Pt(10.5)
                run.font.name = 'Times New Roman'
                run._element.rPr.rFonts.set(qn('w:eastAsia'), '宋体')
                run.font.bold = True
    
    # 填充数据
    for i, row in df.iterrows():
        for j, value in enumerate(row):
            cell = table.rows[i+1].cells[j]
            if isinstance(value, (int, float)):
                cell.text = f"{value:.4f}" if isinstance(value, float) else str(value)
            else:
                cell.text = str(value)
            # 设置数据格式
            for paragraph in cell.paragraphs:
                paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER
                for run in paragraph.runs:
                    run.font.size = Pt(10.5)
                    run.font.name = 'Times New Roman'
                    run._element.rPr.rFonts.set(qn('w:eastAsia'), '宋体')
    
    # 设置三线表边框（仅顶部、表头下方、底部有线）
    for row_idx, row in enumerate(table.rows):
        for cell in row.cells:
            # 清除所有边框
            set_cell_border(cell,
                top={"sz": 0, "val": "none"},
                left={"sz": 0, "val": "none"},
                bottom={"sz": 0, "val": "none"},
                right={"sz": 0, "val": "none"}
            )
            
            # 顶部粗线
            if row_idx == 0:
                set_cell_border(cell, top={"sz": 12, "val": "single", "color": "000000"})
            
            # 表头下方细线
            if row_idx == 0:
                set_cell_border(cell, bottom={"sz": 6, "val": "single", "color": "000000"})
            
            # 底部粗线
            if row_idx == len(table.rows) - 1:
                set_cell_border(cell, bottom={"sz": 12, "val": "single", "color": "000000"})
    
    doc.add_paragraph()  # 添加空行

# 创建Word文档
doc = Document()

# 设置默认字体
doc.styles['Normal'].font.name = 'Times New Roman'
doc.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), '宋体')
doc.styles['Normal'].font.size = Pt(12)

# 标题
title = doc.add_heading('医疗卫生服务能力综合评价分析报告', level=0)
title.alignment = WD_ALIGN_PARAGRAPH.CENTER
for run in title.runs:
    run.font.size = Pt(18)
    run.font.name = 'Times New Roman'
    run._element.rPr.rFonts.set(qn('w:eastAsia'), '黑体')
    run.font.color.rgb = RGBColor(0, 0, 0)

# 副标题
subtitle = doc.add_paragraph()
subtitle.alignment = WD_ALIGN_PARAGRAPH.CENTER
run = subtitle.add_run('基于熵权TOPSIS方法的面板数据分析')
run.font.size = Pt(14)
run.font.name = 'Times New Roman'
run._element.rPr.rFonts.set(qn('w:eastAsia'), '楷体')

doc.add_paragraph()

# 一、研究背景与方法
doc.add_heading('一、研究背景与方法', level=1)

p = doc.add_paragraph()
p.add_run('本研究采用熵权TOPSIS方法对7个地区2020-2022年的医疗卫生服务能力进行综合评价。')
p.add_run('评价指标体系包括9个指标：医院个数、床位数量、医师人数、护士人数、门诊人均费用、住院人均费用、病床使用率、总诊疗人次和出院人次。')

p = doc.add_paragraph()
p.add_run('熵权法：').bold = True
p.add_run('客观赋权方法，基于数据离散程度确定权重，差异越大的指标权重越高，避免主观因素影响。')

p = doc.add_paragraph()
p.add_run('TOPSIS法：').bold = True
p.add_run('逼近理想解排序法，同时考虑与正理想解和负理想解的距离，综合评价更加全面。')

p = doc.add_paragraph()
p.add_run('面板数据分析：').bold = True
p.add_run('结合时间序列和截面数据，可以观察动态变化趋势，提供更丰富的分析视角。')

doc.add_paragraph()

# 二、评价指标权重
doc.add_heading('二、评价指标权重', level=1)

# 读取权重数据
df_weights = pd.read_csv('output/cases/panel_indicator_weights.csv')
df_weights_display = df_weights[['indicator_cn', 'weight']].copy()
df_weights_display.columns = ['指标名称', '权重']
df_weights_display = df_weights_display.sort_values('权重', ascending=False).reset_index(drop=True)
df_weights_display.index = df_weights_display.index + 1
df_weights_display.index.name = '排名'
df_weights_display = df_weights_display.reset_index()

add_three_line_table(doc, df_weights_display, '表1 评价指标权重表')

p = doc.add_paragraph()
p.add_run('权重分析：').bold = True
top3 = df_weights_display.head(3)
p.add_run(f"权重最高的三个指标分别是{top3.iloc[0]['指标名称']}（{top3.iloc[0]['权重']:.4f}）、")
p.add_run(f"{top3.iloc[1]['指标名称']}（{top3.iloc[1]['权重']:.4f}）和")
p.add_run(f"{top3.iloc[2]['指标名称']}（{top3.iloc[2]['权重']:.4f}），")
p.add_run('这些指标在不同地区间差异较大，对综合评价影响最为显著。')

doc.add_paragraph()

# 三、综合评价结果
doc.add_heading('三、综合评价结果', level=1)

# 读取评价结果
df_results = pd.read_csv('output/cases/panel_evaluation_results.csv')

# 3.1 各年份排名
doc.add_heading('3.1 各年份排名情况', level=2)

for year in [2020, 2021, 2022]:
    df_year = df_results[df_results['year'] == year].copy()
    df_year = df_year.sort_values('rank_year')
    df_year_display = df_year[['rank_year', 'region', 'score', 'closeness', 'performance_group']].copy()
    df_year_display.columns = ['排名', '地区', '综合得分', '相对贴近度', '绩效等级']
    df_year_display = df_year_display.reset_index(drop=True)
    
    add_three_line_table(doc, df_year_display, f'表{year-2017} {year}年医疗卫生服务能力综合评价结果')

# 3.2 地区平均表现
doc.add_heading('3.2 地区平均表现（2020-2022年）', level=2)

df_region = pd.read_csv('output/cases/panel_region_summary.csv')
df_region_display = df_region[['rank', 'region', 'avg_score', 'max_score', 'min_score']].copy()
df_region_display.columns = ['排名', '地区', '平均得分', '最高分', '最低分']

add_three_line_table(doc, df_region_display, '表6 地区平均表现排名表')

# 3.3 年度趋势
doc.add_heading('3.3 年度变化趋势', level=2)

df_yearly = pd.read_csv('output/cases/panel_yearly_summary.csv')
df_yearly_display = df_yearly[['year', 'avg_score', 'min_score', 'max_score']].copy()
df_yearly_display.columns = ['年份', '平均得分', '最低分', '最高分']

add_three_line_table(doc, df_yearly_display, '表7 年度综合得分变化表')

p = doc.add_paragraph()
p.add_run('趋势分析：').bold = True
score_2020 = df_yearly_display[df_yearly_display['年份'] == 2020]['平均得分'].values[0]
score_2022 = df_yearly_display[df_yearly_display['年份'] == 2022]['平均得分'].values[0]
change = score_2022 - score_2020
if abs(change) < 0.01:
    p.add_run(f'2020-2022年间，各地区医疗卫生服务能力综合得分保持稳定，')
    p.add_run(f'平均得分维持在{score_2020:.2f}分左右。')
else:
    trend = "上升" if change > 0 else "下降"
    p.add_run(f'2020-2022年间，各地区医疗卫生服务能力综合得分总体呈{trend}趋势，')
    p.add_run(f'从{score_2020:.2f}分变化至{score_2022:.2f}分。')

doc.add_paragraph()

# 四、可视化分析
doc.add_heading('四、可视化分析', level=1)

# 添加图表
figures = [
    ('panel_score_trend.png', '图1 各地区综合得分时间趋势图'),
    ('panel_score_boxplot.png', '图2 各年份综合得分分布箱线图'),
    ('panel_region_ranking.png', '图3 各地区平均综合得分排名图'),
    ('panel_heatmap.png', '图4 地区-年份综合得分分布图'),
    ('panel_indicator_weights.png', '图5 评价指标权重分布图'),
    ('panel_top3_comparison.png', '图6 2022年前3名地区主要指标对比图')
]

for fig_file, fig_title in figures:
    try:
        doc.add_picture(f'output/cases/figures/{fig_file}', width=Inches(6))
        p = doc.add_paragraph()
        p.alignment = WD_ALIGN_PARAGRAPH.CENTER
        run = p.add_run(fig_title)
        run.font.size = Pt(10.5)
        run.font.name = 'Times New Roman'
        run._element.rPr.rFonts.set(qn('w:eastAsia'), '宋体')
        doc.add_paragraph()
    except Exception as e:
        print(f"警告: 无法添加图片 {fig_file}: {e}")

# 五、主要发现
doc.add_heading('五、主要发现', level=1)

p = doc.add_paragraph()
p.add_run('1. 地区差异显著：').bold = True
best_region = df_region_display.iloc[0]['地区']
best_score = df_region_display.iloc[0]['平均得分']
worst_region = df_region_display.iloc[-1]['地区']
worst_score = df_region_display.iloc[-1]['平均得分']
gap = best_score - worst_score
p.add_run(f'{best_region}表现最佳（平均{best_score:.2f}分），')
p.add_run(f'{worst_region}相对较弱（平均{worst_score:.2f}分），')
p.add_run(f'地区间差距达{gap:.2f}分，说明医疗卫生资源配置存在明显的地区不平衡。')

p = doc.add_paragraph()
p.add_run('2. 关键指标识别：').bold = True
p.add_run(f'门诊人均费用和医师人数是影响综合评价的最关键因素，')
p.add_run('应重点关注医疗费用控制和医疗人才队伍建设。')

p = doc.add_paragraph()
p.add_run('3. 时间稳定性：').bold = True
p.add_run('各地区在三年间的排名和得分保持相对稳定，')
p.add_run('说明医疗卫生服务能力的提升需要长期持续的投入和建设。')

doc.add_paragraph()

# 六、政策建议
doc.add_heading('六、政策建议', level=1)

p = doc.add_paragraph('1. ', style='List Number')
p.add_run('加强薄弱地区支持：').bold = True
p.add_run('对得分较低的地区加大财政投入和政策扶持力度，')
p.add_run('缩小地区间医疗卫生服务能力差距。')

p = doc.add_paragraph('2. ', style='List Number')
p.add_run('控制医疗费用：').bold = True
p.add_run('建立合理的医疗价格形成机制，')
p.add_run('降低门诊和住院人均费用，减轻患者经济负担。')

p = doc.add_paragraph('3. ', style='List Number')
p.add_run('优化资源配置：').bold = True
p.add_run('根据各地区人口规模和医疗需求，')
p.add_run('合理配置医院、床位、医师和护士等医疗资源。')

p = doc.add_paragraph('4. ', style='List Number')
p.add_run('提高使用效率：').bold = True
p.add_run('加强医院管理，提高病床使用率和医疗服务效率，')
p.add_run('充分发挥现有医疗资源的作用。')

p = doc.add_paragraph('5. ', style='List Number')
p.add_run('建立动态监测机制：').bold = True
p.add_run('定期开展医疗卫生服务能力评价，')
p.add_run('及时发现问题并采取针对性改进措施。')

doc.add_paragraph()

# 七、研究局限性
doc.add_heading('七、研究局限性', level=1)

p = doc.add_paragraph()
p.add_run('1. 本研究仅选取了9个评价指标，未能全面反映医疗卫生服务能力的所有维度。')

p = doc.add_paragraph()
p.add_run('2. 数据时间跨度为3年，相对较短，难以充分反映长期变化趋势。')

p = doc.add_paragraph()
p.add_run('3. 熵权法为客观赋权方法，未考虑专家意见和政策导向，')
p.add_run('可结合层次分析法等主观赋权方法进行综合评价。')

p = doc.add_paragraph()
p.add_run('4. 本研究未考虑地区间的经济发展水平、人口规模等差异，')
p.add_run('后续研究可引入这些因素进行更深入的分析。')

# 保存文档
output_file = 'output/cases/医疗卫生服务能力综合评价分析报告_面板数据.docx'
doc.save(output_file)
print(f"\n✓ Word报告已生成: {output_file}")
print(f"  文件大小: {os.path.getsize(output_file) / 1024:.1f} KB")

